package com.xiaoge.circulardependency;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

/**
 * TODO
 *  spring @Autowired 打破循环依赖的过程
 *  1. 创建AService, 把AService放入到正在常见的bean容器中, 放入到三级缓存中, 属性填充发现需要BService
 *  2  创建BService, 把BService放入到正在常见的bean容器中, 放入到三级缓存中, 属性填充发现需要AService,
 *  判断一级缓存没有而且是正在创建的bean, 从三级缓存拿到对应的lambda表达式执行放入到二级缓存中,BService创建完毕, 放入一级缓存, 删除二三级缓存
 *  3. AService也能拿到BService, 放入一级缓存, 删除二三级缓存
 *
 * @author <a href="mailto:1330137071@qq.com">Zhang Xiao</a>
 * @since
 */
@Component
public class AService {

	private BService bService;  // @Lazy会成 BService代理对象 来打破循环依赖, 但是执行BService方法的时候, 它会去spring容器里面找到BService去执行对应的方法

	@Lazy // @Lazy 可以解决循环依赖  或者  无参构造方法
	public AService (BService bService) {
		this.bService = bService;
	}

	public void test () {
		System.out.println(this.bService.toString()); // @Lazy会成 BService代理对象 来打破循环依赖, 但是执行BService方法的时候, 它会去spring容器里面找到BService去执行对应的方法
	}
}
